from requests import request
from enum import Enum
from typing import List, Dict, Optional
import re
from Logs.logs import forge_logger
import os
import json


class ProductName(Enum):  # 定义产品名称
    suki = "suki"
    mua = "mua"
    lookus = "lookus"
    ghost = "ghost"
    reader = "reader"
    chuqu = "chuqu"
    hebao = "hebao"
    heizai = "heizai"


def tracking_value_change(text: str) -> Optional[Dict[int, Optional[dict]]]:
    """
    根据给定的文本提取信息，并将其转换为字典格式。

    该函数使用正则表达式来匹配文本中的键值对信息。每个键值对由一个英文字符串（键）
    和其后的中文冒号或英文冒号分隔的值组成。如果文本中没有匹配到任何数据，函数将返回None。

    :param text: 包含键值对信息的字符串文本
    :return: 一个字典，包含从文本中提取的键值对。如果没有找到匹配项，则返回None
    """
    pattern = re.compile(r"([a-zA-Z]+)[：:]([^\s]*)")
    result_dict = {}
    matches = pattern.findall(text)
    if not matches:
        forge_logger.debug(fr"没有匹配到任何数据,当前的文本是{text}")
        return None
    for match in matches:
        key = match[0].strip()
        value = match[1].strip()
        result_dict[key] = value
    forge_logger.success(f"原始文本为{text}，转换后的字典为:{result_dict}")
    return result_dict


def list_to_dict_conversion(data_list: List[list]) -> dict:
    """
    将列表转换为字典的函数。
    此函数接受一个二维列表作为输入，其中每个子列表包含四个元素。函数将这些子列表转换为一个字典，
    其中第一个元素作为键，第三个元素作为子字典的键，第四个元素作为子字典的值（如果非空）。
    :param data_list: 一个包含多个子列表的列表，每个子列表包含四个元素
    :return: 一个转换后的字典，包含根据输入列表构建的键值对。
    """
    response = {}
    for data in data_list:
        tracking_dict = {}
        if data[0] == 0:
            continue
        tracking_dict[data[2]] = None if data[3] == "" else tracking_value_change(data[3])
        response[data[0]] = tracking_dict
    return response


def get_product_event_tracking(product_id: ProductName) -> List[list]:
    """
    对埋点接口发起请求
    :param product_id: 项目名称
    :return: 字典
    """
    url = f"https://family.codeffect.top/events/get_event/{product_id.value}"
    headers = {"authorization": "Basic dGFueGluOmNjdHY2bmJoaA==",
               "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 ""Safari/537.36"}
    response = request("GET", url, headers=headers).json()
    data = response.get("data")
    return data


def write_to_file(product_name: ProductName) -> None:
    """
    将埋点写入json文件
    :param product_name: 项目名称
    :return: None
    """
    current_dir = os.path.dirname(os.path.abspath(__file__)) if '__file__' in globals() else os.getcwd()
    file_path = os.path.join(current_dir, "DataTest", "JsonData", f"{product_name.value}_tracking.json")
    data = get_product_event_tracking(product_name)
    data = list_to_dict_conversion(data)
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)


if __name__ == '__main__':
    write_to_file(ProductName.mua)
    # write_to_file(ProductName.lookus)
